package org.backend.task;

import lombok.extern.slf4j.Slf4j;
import org.backend.pojo.entity.Transaction;
import org.backend.repository.TransactionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * 定时任务类
 */
@Component
@Slf4j
public class TransactionTask {

    @Autowired
    private TransactionRepository transactionRepository;

    /**
     * cron = "0 0,30 * * * ?"：
     * 第一个 0 表示秒，表示在每个小时的 0 秒时开始。
     * 0,30 表示分钟，在每小时的第 0 分钟和第 30 分钟执行。
     * * 表示小时，表示每个小时都会执行。
     * * 表示日期，表示每天都会执行。
     * * 表示月份，表示每个月都会执行。
     * ? 表示不指定星期几。
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    @Transactional
    public void executeTask() {
        LocalDateTime now = LocalDateTime.now();
        log.info("定时处理超时订单: {}", now);

        List<Transaction> transactionList = transactionRepository.getAllTransaction();
        log.info("transactionList: {}", transactionList);

        for (Transaction transaction : transactionList) {
            LocalDateTime transactionEndTime = transaction.getTransactionEndTime();

            // 如果订单已经超时（暂定24小时）
            if (transactionEndTime.isBefore(now) && Objects.equals(transaction.getTransactionStatus(), "待付款")) {
                transactionRepository.deleteTransaction(transaction.getTransactionId());
                log.info("超时订单:{} , 已删除", transaction.getTransactionId());
            }
        }
    }

    @Scheduled(cron = "0 0/5 * * * ?")
    public void transformStatus() {
        List<Integer> transactionIdList = transactionRepository.getTransactionId();
        for (Integer transactionId : transactionIdList) {
            if (transactionRepository.reviseTransactionStatus(transactionId)) {
                Transaction transaction = new Transaction();
                transaction.setTransactionStatus("已发货");
                transaction.setTransactionId(transactionId);
                log.info("transaction: {}", transaction);
                transactionRepository.update(transaction);
                log.info("订单号为：{} 已发货", transactionId);
            }
        }

    }

}
